//登录和注册的仓库
import { reqUsercode, reqRegister, reqlogin, reqUserInfo, reqOutLogin } from "@/api";
import { setToken, getToken, clearToken } from "@/utils/token";
export default {
    namespaced: true,
    actions: {
        //发送验证码请求
        async getcode(context, phone) {
            //!!获取验证码接口，把验证码返回，正常情况，后台把验证码发送给用户手机上  就不用存在仓库
            let result = await reqUsercode(phone)
            // console.log(result)
            if (result.code == 200) {
                context.commit('GETCODE', result.data)
                return "ok"
            } else {
                return Promise.reject(new Error(result.message))
            }

        },
        //发送注册账号请求
        async getRegister(context, data) {
            let result = await reqRegister(data)
            console.log(result)
            if (result.code == 200) {
                return "ok"
            } else {
                // 如果result.code不是200  则抛出 字符串“faile”
                return Promise.reject(new Error("faile"))
            }
        },
        //发送登录账号请求
        async getLogin(context, data) {
            //!!!在发送登录请求中 请求头中是没有token 是因为登录请求发送完成后，才有的token的值，（很关键的理解）
            //!!而发送获取用户信息请求，已经有了token的值 ，所以在发送获取用户信息请求时，请求头带有token的值（很关键的理解）
            let result = await reqlogin(data)
            console.log(result, '发送登录请求')
            //!if这行代码 必须写  因为发送请求成功的返回结果也有很多  有些成功的code不等于200 就不是我们需要的 如果不写if 则后面的代码也会执行
            if (result.code == 200) {
                context.commit('GETLOGIN', result.data)
                //!!正常可以下面这样写 但是一些公司会单独建立一个token.js来单独写成一个函数来用
                // !!localStorage.setItem('TOKEN', result.data.token)
                //存储获得的token
                setToken(result.data.token)
                return "ok"
            } else {
                console.log(result, '登录请求失败时的信息')
                // 如果result.code不是200  则抛出信息result.message的结果信息
                return Promise.reject(new Error(result.message))
            }

        },
        //!!获取用户信息  在home组件渲染完成时发送请求
        //!!这里发送请求需要给后端带有请求头token的值 才能获得用户信息  不需要在参数里面带有token信息
        async getUserInfo({ commit, state, dispatch }) {
            let result = await reqUserInfo();
            // console.log(result, '获得用户信息')
            if (result.code == 200) {
                commit('SET_USERINFO', result.data.nickName);
                return 'ok';
            } else {
                return Promise.reject(new Error(result.message));
            }
        },
        //退出登录模块
        async getOutLogin(context) {
            //向服务器发送请求 ，清除服务器的token值
            let result = await reqOutLogin()
            // console.log(result, '退出登录测试')
            if (result.code == 200) {
                context.commit('GETOUTLOGIN')
                return 'ok'
            } else {
                Promise.reject(new Error(result.message))
            }
        }
    },
    mutations: {
        //储存验证码
        GETCODE(state, data) {
            state.code = data
        },
        //储存登录用户信息
        GETLOGIN(state, data) {
            state.token = data.token
        },
        SET_USERINFO(state, nickName) {
            state.userInfo = nickName;
        },
        GETOUTLOGIN(state) {
            state.userInfo = ''
            state.token = ''
            clearToken()
        }
    },
    state: {
        //验证码信息
        code: '',
        //获得token值  这里有了token的值，每次发请求时，都会执行请求拦截器的带有token的值的那一步,从而执行上面的请求获取用户信息才会成功
        token: getToken(),
        //用户名字信息
        userInfo: '',
    },
    getters: {

    }
}